package com.gujia.designpattern.template;

public abstract  class RefreshBeverage {

    /**
     * 制备饮料的模板方法
     * 封装了所有子类共同遵循的算法框架
     */
    public final void prepareBeverageTemplate(){

        boilWater();

        brew();

        pourInCup();

        if(isWantsCondiments()){
            addCondiments();
        }

    }

    /**
     * Hook,钩子函数，提供一个默认或空的实现
     * 具体的子类可以自行决定是否挂钩以及如何挂钩
     * 询问用户是否加入调料
     * @return
     */
    protected boolean isWantsCondiments() {
        return true;
    }

    /**
     * 基本方法，将水煮沸
     */
    private void boilWater() {
        System.out.printf("将水煮沸");
    }

    /**
     * 抽象的基本方法，泡制饮料
     */
    protected abstract void brew();

    /**
     * 基本方法，倒入杯中
     */
    private void pourInCup() {
        System.out.printf("将饮料到入杯中");
    }

    /**
     * 抽象的基本方法，加入调料
     */
    protected abstract void addCondiments();
}
